<?php
/**
 * 大文件分块上传，大文件分块下载
 */
// 设置PHP最大使用内存 1G
ini_set('memory_limit', '1024M');
// 服务目录
define('SERVER_PATH', dirname(__FILE__));

// 服务初始化
require_once SERVER_PATH . '/Core/Core.php';

// 创建http服务器
$http_server = new swoole_http_server("0.0.0.0", 9501); 

// 运行参数设置
$http_server->set([
    'daemonize' => 0        // 守候进程
    ,'task_worker_num'     => 10       // 任务进程数量
//    ,'log_file'  => SERVER_PATH . '/Log/runtime.log'      // 运行日志
    ,'package_max_length'    => 1024*1024*2             // 最大包长，默认：2M
    ,'group'    => 'www'        // 运行用户组
    ,'user'     => 'www'        // 运行用户
    ,'worker_num'   => 8,     // 进程数；CPU 1-4 倍
]);

// 监听服务启动
$http_server->on("start", function($server){
    // 运行初始化
    Core()->runtime($server);
});

// 监听客户端请求
$http_server->on("request", function($request, $response)use($http_server){
     // 路由处理
    $result = Core()->route($request, $response, $http_server);
    
    // 返回结果
    $response->end($result);
});

/**
 * 监听任务
 * @param swoole_server $server    服务对象
 * @param int $task_id             任务ID
 * @param int $src_worker_id       来源进程ID
 * @param string|array $data              任务数据
 */
$http_server->on('task', function($server, $task_id, $src_worker_id, $data){
    // 处理函数
    if(!isset($data['handle']))  return error('Task handle function required.');
    
    // 解析处理函数
    list($type, $class, $function) = explode('/', $data['handle']);
    
    // 处理函数错误
    if(!$type || !$class || !$function) return error('Task handle function not exists.');
    $type = strtolower($type);
    
    return Core()->$type($class)->$function(isset($data['argv'])?$data['argv']:'');
});

/**
 * 监听任务完成
 * @param swoole_server $server    服务对象
 * @param int $task_id             任务ID
 * @param string|array $data             任务返回数据
 */
$http_server->on('finish', function($server, $task_id, $data){
    echo "------------------任务完成---------------------------\n";
    echo "任务ID：".$task_id."\n";
    echo "任务数据：";
    var_dump($data);
});

// 启动http服务器
$http_server->start();